home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 11, No. 04 - 05 - 06 (1990)(MindCraft Publishing)[no boot].zip
/
Nibble Volume 11, No. 04 - 05 - 06 (1990)(MindCraft Publishing)[no boot].po
/
NIBBLE.1990:MAY.VOL11.NO05
/
FORMATTER.BIN.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
6KB
|
145 lines
********************************
* FORMATTER.BIN SOURCE CODE *
* BY MIKE PRIDMORE *
* COPYRIGHT(C) 1990 *
* MINDCRAFT PUBL. CORP. *
* CONCORD, MA 01742 *
********************************
*
* EDITOR ASSEMBLER -=> MERLIN-8
*
HTAB EQU $24 ; CURSOR HORIZONTAL LOCATION
CHRGET EQU $B1 ; GET NEXT CHARACTER ROUTINE
HIMEM EQU $73 ; POINTER TO HIGHEST RAM MEMORY
STRTOP EQU $6F ; POINTER TO TOP OF STRING POOL
STRADD EQU $5E ; HOLDS REQUESTED STRING LOCATION
*
* CONSTANTS & AMPERSAND VECTOR
*
SPACE EQU $20 ; HEX FOR 'SPACE' CHARACTER
TOKEN EQU $BA ; HEX FOR PRINT TOKEN
WIDTH EQU $28 ; SET TO MAX WIDTH OF YOUR SCREEN
CR EQU $8D ; HEX FOR CARRIAGE RETURN
MINUS EQU $80 ; HEX FOR 128 DECIMAL
AMPVEC EQU $3F5 ; LOCATION OF AMPERSAND VECTOR
*
* APPLESOFT ROUTINES
*
FRESTR EQU $E5FD ; PUTS STRING LOCATION IN STRADD
EVAL EQU $DD7B ; EVALUATE EXPRESSION ROUTINE
SYNERR EQU $DEC9 ; PRINT SYNTAX ERROR
PRINT EQU $FDF0 ; PRINT CHARACTER TO SCREEN
*
ORG $94ED
*
LDA #<INIT ; SET HIMEM, MAX STRING ADDRESS
STA HIMEM ; AND AMPERSAND VECTOR TO $9500,
STA STRTOP ; THE ADDRESS OF THE MAIN ROUTINE
STA AMPVEC+1
LDA #>INIT
STA HIMEM+1 ; BUT NOT THE ROUTINE ITSELF.
STA STRTOP+1
STA AMPVEC+2
RTS ; RETURN TO BASIC PROGRAM
*
* INIT ROUTINE
*
INIT CMP #TOKEN ; IS CHAR A PRINT TOKEN ($BA)?
BEQ FINDSTR ; YES, CONTINUE AT FINDSTR
JMP SYNERR ; NO, PRINT SYNTAX ERROR
*
* FIND STRING ROUTINE
*
FINDSTR JSR CHRGET ; GET NEXT CHAR AFTER PRINT TOKEN
JSR EVAL ; A/S STRING? NO, PRINT ERR MSG
JSR FRESTR ; PUT ADDRESS IN $5E, A=LEN OF STR
STA LEN ; STORE STRING LENGTH
DEC LEN ; SUBTRACT ONE FROM IT
LDA #$00 ; SET ALL POINTERS TO ZERO
STA BEGIN ; AND SET HTAB = 1 (ZERO IN HEX)
STA END
STA FLAG
STA HTAB
*
* ADD ROUTINE
*
ADD CLC ; CLEAR THE CARRY FLAG
LDA BEGIN ; GET SUBSTRINGS STARTING POINTER
ADC #WIDTH ; ADD TO WIDTH TO FIND END PTR
CMP LEN ; COMPARE RESULTS AGAINST LEN
BEQ ADD2 ; IF EQUAL BRANCH TO ADD2
BGE LASTLINE ; IF >, THIS IS LAST LINE
ADD2 STA END ; STORE RESULTS IN END
LDY BEGIN ; SET Y TO EQUAL BEGIN POINTER
LOOP LDA (STRADD),Y ; GET A CHARACTER
CMP #$20 ; IS IT A SPACE?
BEQ SEARCH ; YES, THEN A SPACE IS PRESENT
CPY END ; IS Y=END? (CHECK WHOLE SUBSTRING?)
BEQ NONE ; YES, THEN NO SPACE WAS FOUND.
INY ; NO, THEN Y=Y+1
BNE LOOP ; LET'S DO IT AGAIN
*
* SEARCH FOR SPACE ROUTINE
*
SEARCH LDY END ; SET Y = TO END PTR
LOOP1 LDA (STRADD),Y ; GET A CHAR
CMP #SPACE ; IS IT A SPACE?
BEQ WHERE ; YES, FIND OUT WHERE IN STRING
DEY ; NO THEN Y=Y-1
BNE LOOP1 ; TRY AGAIN
WHERE CPY END ; IS Y = END (40 CHAR BEIGN PRINTED?)
BLT LESS ; NO, < 40 CHAR TO BE PRINTED
INC FLAG ; FLAG=1 (40 CHAR TO BE PRINTED)
DEC END ; SET END= LAST LETTER OF SUBSTRING
JMP PRINTIT ; PRINT OUT STRING
LESS DEY ; Y=Y-1
STY END ; STRORE Y RESULTS IN END
JMP PRINTIT ; PRINT OUT SUBSTRING
NONE DEC END ; END = END -1
LDA #$03 ; FLAG = 3, NO SPACE FOUND
STA FLAG
JMP PRINTIT ; PRINT OUT SUBSTRING
LASTLINE LDA #$02 ; FLAG=2, LAST LINE TO PRINT
STA FLAG
LDA LEN ; SET A = LEN
STA END ; STORE IT IN END
*
* PRINT OUT SUBSTRING OF STRING
*
PRINTIT LDY BEGIN ; SET Y = TO BEGINNING LETTER
LOOP2 LDA (STRADD),Y ; GET THE LETTER FROM THE STRING
ORA #MINUS ; STRIP OFF THE HI BIT
JSR PRINT ; PRINT IT
CPY END ; ARE WE DONE WITH THIS LINE?
BEQ CHKFLAG ; YES, CHECK TO SEE OF FLAG > 0
INY ; NO THEN Y=Y+1
BNE LOOP2 ; DO IT AGAIN
CHKFLAG LDA FLAG ; A=FLAG
CMP #$01 ; FLAG=1?
BEQ FORTY ; YES, EXACTLY 40 CHAR PRINTED
CMP #$02 ; FLAG=2?
BEQ EXIT ; YES, EXIT ROUTINE
CMP #$03 ; FLAG=3?
BEQ NOSPACE ; YES, NO SPACES WERE FOUND
LDA #CR ; IF FLAG=0, SET A=CARRIAGE RETURN
JSR PRINT ; PRINT IT
INC END ; SET END TO POINT TO NEXT LETTER
INC END ; AND STORE IT IN BEGIN POINTER
LDY END
STY BEGIN
JMP ADD ; GET NEXT SUBSTRING
FORTY INC END ; END = END + 1
NOSPACE INC END ; END = END + 1
LDY END ; SET BEGIN TO EQUAL END
STY BEGIN
LDA #$00 ; SET FLAG TO ZERO
STA FLAG
JMP ADD ; GET NEXT SUBSTRING
EXIT LDA #CR ; SET A = CARRIAGE RETURN
JSR PRINT ; PRINT IT
RTS ; RETURN TO BASIC PROGRAM
LEN DS 1 ; HOLDS LEN OF STRING TO PRINT
BEGIN DS 1 ; HOLDS 1ST CHAR IN SUBSTRING
END DS 1 ; HOLDS LAST CHAR IN SUBSTRING
FLAG DS 1 ; USE TO INDICATE CONDITIONS